package moc.tds;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import moc.type.*;

/**
 * une TDS hiérarchique.
 * 
 * @author marcel
 * 
 */
public class TDS extends HashMap<String, INFO> {

	private static final long serialVersionUID = 1L;

	/**
	 * La TDS parente
	 */
	private TDS parente;

	/**
	 * Constructeur pour une TDS sans parente
	 */
	public TDS() {
		this(null);
	}

	/**
	 * Constructeur pour une TDS fille de p
	 * 
	 * @param p
	 */
	public TDS(TDS p) {
		super();
		parente = p;
	}

	public TDS getParente() {
		return parente;
	}

	/**
	 * Recherche de n dans la TDS courante uniquement
	 * 
	 * @param n
	 * @return
	 */
	public INFO chercherLocalement(String n) {
		return get(n);
	}
	
	public INFO chercherLocalementFonction(String n,SIGNATURE sig) {
		 INFO retour = null ;
		for(String s : this.keySet()){
			
			if (s.substring(0, s.length()-1).equals(n)){
					INFO aux = this.get(s) ;
				if(aux instanceof INFOFUN && ((INFOFUN)aux).getSignature().equals(sig))
				retour = this.get(s) ;
			}
		}
		return retour ;
	}
		
		public INFO chercherLocalementFonction(String n,ArrayList<DTYPE> sig) {
			 INFO retour = null ;
			for(String s : this.keySet()){
				
				if (s.substring(0, s.length()-1).equals(n)){
						INFO aux = this.get(s) ;
					if(aux instanceof INFOFUN && ((INFOFUN)aux).getSignature().signatureConfomes(sig))
					retour = this.get(s) ;
				}
			}
		return retour ;
	}

	public INFO chercherLoacalementVariable(String n){
		
		
		return null ;
	}

	/**
	 * Recherche de n dans la TDS courante et ses parentes.
	 * 
	 * @param n
	 * @return
	 */
	
	
	public INFO chercherGlobalementFonction(String n,ArrayList<DTYPE> sig) {
		INFO i = chercherLocalementFonction(n,sig);
		if (i == null  )
			if (parente != null)
				i= parente.chercherGlobalementFonction(n,sig);
		
		return i ;
	
	}
	
	public INFO chercherGlobalementFonction(String n,SIGNATURE sig) {
        
		INFO i = chercherLocalementFonction(n,sig);
		if (i == null )
			if (parente != null)
				i= parente.chercherGlobalementFonction(n,sig);
		
		return i ;
	
	}
	
	public INFO chercherGlobalement(String n) {
		INFO i = chercherLocalement(n);
		if (i == null)
			if (parente != null)
				return parente.chercherGlobalement(n);
		return i;
	}

	/**
	 * Ajoute le nom n et son information i dans la TDS
	 * 
	 * @param n
	 * @param i
	 */
	public void inserer(String n, INFO i) {
		put(n, i);
	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		Set<Map.Entry<String, INFO>> s = entrySet();
		for (Map.Entry<String, INFO> e : s) {
			sb.append("; " + e.getKey() + " : " + e.getValue() + '\n');

		}
		return sb.toString();
	}

	
	public void inserer(SIGNATURE sig){
		for(String s : sig.keySet())
			this.inserer(s,sig.get(s));
	}
}
